<script>
import axios  from "axios";
import { reactive } from 'vue'
const curUser = reactive({})

// 获取用户信息
const fetchUser = async () => {
  try {
    const token = sessionStorage.getItem('jwt')
    if(!token){
      this.$router.push({path:'/login'});
    }
    const response = await axios.get('/user', {
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token.slice(1, -1)}` // 添加认证令牌
      }
    })
    curUser.value = response.data
  } catch (err) {
    console.error('获取用户信息失败:', err)
  }
}
export default {
  name: 'BusinessInfo',
  data(){
    return{
      businessId: this.$route.query.businessId,
      business:{},
      foodArr:[],
      jwt:{}
    }
  },
  async created(){
    this.jwt=sessionStorage.getItem('jwt');
    await fetchUser();

    //根据businessId查询商家信息
    await this.fetchBusinessByBusinessId();

    //根据businessId查询所属食品信息
    await this.fetchFoodByBusinessId();
  },
  methods:{
    //发送GET请求获取商家信息
    async fetchBusinessByBusinessId() {
      try {
        const token = sessionStorage.getItem('jwt');
        const response = await axios.get('/businesses',{
          params: {
            businessId: this.businessId,
          },
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.slice(1,-1)}`  // 添加认证令牌
          }
        });
        this.business = response.data.data[0];
      } catch (error) {
        console.error('获取商家食品失败:', error);
      }
    },
    // 发送GET请求获取商家商品信息
    async fetchFoodByBusinessId() {
      try {
        const token = sessionStorage.getItem('jwt');
        const response = await axios.get('/foods',{
          params: {
            business: this.businessId,
          },
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.slice(1,-1)}`  // 添加认证令牌
          }
        });
        this.foodArr = response.data.data;
        for (let i = 0; i < this.foodArr.length; i++) {
          this.foodArr[i].quantity = 0;
        }
        if (this.jwt != null) {
          await this.fetchCartByBusinessIdUserId();
        }
      } catch (error) {
        console.error('获取商家食品失败:', error);
      }
    },
    async fetchCartByBusinessIdUserId() {
      try {
        const token = sessionStorage.getItem('jwt');
        const response = await axios.get('/carts',{
          params: {
            business: this.businessId,
            user: curUser.value.id,
          },
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.slice(1,-1)}`  // 添加认证令牌
          }
        });
        for(let i = 0; i < response.data.data.length; i++) {
          for(let j = 0; j < this.foodArr.length; j++) {
            if(response.data.data[i].food.id === this.foodArr[j].id){
              this.foodArr[j].quantity=response.data.data[i].quantity;
              break;
            }
          }
        }
      } catch (error) {
        console.error('获取购物车食品失败:', error);
      }
    },
    add(index){
      //首先做登陆验证
      if(this.jwt==null){
        this.$router.push({path:'/login'});
        return;
      }
      this.addCartItemByIndex(index);
    },
    async addCartItemByIndex (index)  {
      const targetFood = this.foodArr[index];

      await fetchUser();
      if (!targetFood || !targetFood.id) {
        throw new Error('该下标对应的食品不存在或食品信息不完整')
      }

      try {
        const response = await axios.post('/carts', {
          food: {
            id: targetFood.id  // 只传食品 id
          },
          quantity: 1 ,// 每次点击加号只增加1个
          user: curUser.value
        }, {
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${this.jwt.slice(1,-1)}`  // 添加认证令牌
          }
        })

        if (response.status === 200 || response.status === 201) {
          return { success: true, message: '添加成功' }
        } else {
          // 后端返回了错误信息
          throw new Error(response.data?.message || '添加失败，未知错误')
        }
      } catch (error) {
        console.error('添加购物车失败：', error)

        if (error.response) {
          const status = error.response.status
          if (status === 404) {
            throw new Error('商品不存在！')
          } else if (status === 401 || status === 403) {
            throw new Error('请先登录！')
          } else {
            throw new Error(error.response.data?.message || `添加失败 (${status})`)
          }
        } else if (error.request) {
          throw new Error('网络错误，请检查网络连接！')
        } else {
          throw new Error('添加失败：' + error.message)
        }
      } finally {
        // 添加成功后刷新购物车数据
        this.fetchCartByBusinessIdUserId();
      }
    },
    minus(index){
      if(this.foodArr[index].quantity>1){
        //update
        this.updateCart(index,-1);
      }else{
        //delete
        this.removeCart(index);
      }
    },
    saveCart(index){
      this.$axios.post('CartController/saveCart',this.$qs.stringify({
        businessId: this.businessId,
        userId:this.user.userId,
        foodId:this.foodArr[index].foodId
      })).then(response => {
        if(response.data==1){
          //此食品数量要更新为1：
          this.foodArr[index].quantity=1;
          this.foodArr.sort();
        }else{
          alert('向购物车中添加食品失败');
        }
      }).catch(error=>{
        console.error(error);
      });
    },
    async updateCart(index,num){
      try {
        const token = sessionStorage.getItem('jwt');
        const newQuantity = this.foodArr[index].quantity + num;
        
        const response = await axios.put('/carts', {
          food: {
            id: this.foodArr[index].id
          },
          quantity: newQuantity
        }, {
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.slice(1,-1)}`
          }
        });

        if (response.status === 200) {
          this.foodArr[index].quantity = newQuantity;
        } else {
          alert('向购物车中更新食品失败');
        }
      } catch (error) {
        console.error('更新购物车失败:', error);
        alert('向购物车中更新食品失败');
      }
    },
    async removeCart(index){
      try {
        const token = sessionStorage.getItem('jwt');
        
        const response = await axios.delete('/carts', {
          params: {
            foodId: this.foodArr[index].id,
            businessId: this.businessId
          },
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.slice(1,-1)}`
          }
        });

        if (response.status === 200) {
          this.foodArr[index].quantity = 0;
        } else {
          alert('从购物车中删除食品失败');
        }
      } catch (error) {
        console.error('删除购物车失败:', error);
        alert('从购物车中删除食品失败');
      }
    },
    toOrder(){
      this.$router.push({path:'/orders',query:{businessId:this.businessId}});
    }
  },
  computed:{
    //食品总价格
    totalPrice(){
      let total=0;
      for(let item of this.foodArr){
        total+=item.foodPrice*item.quantity;
      }
      return total;
    },
    //食品总数量
    totalQuantity(){
      let quantity=0;
      for(let item of this.foodArr){
        quantity+=item.quantity;
      }
      return quantity;
    },
    //结算总价格
    totalSettle(){
      return this.totalPrice+this.business.deliveryPrice;
    }
  }
}
</script>

<template>
  <div class="wrapper">
    <!--header部分-->
    <header>
      <p>商家信息</p>
    </header>

    <!--商家logo部分-->
    <div class="business-logo">
      <img :src="business.businessImg" alt="" />
    </div>

    <!--商家信息部分-->
    <div class="business-info">
      <h1>{{business.businessName}}</h1>
      <p>&#165;{{business.starPrice}}起送 &#165;{{business.deliveryPrice}}配送</p>
      <p>{{business.businessExplain}}</p>
    </div>

    <!--食品列表部分-->
    <ul class="food">
      <li v-for="(item,index) in foodArr">
        <div class="food-left">
          <img :src="item.foodImg" alt="" />
          <div class="food-left-info">
            <h3>{{item.foodName}}</h3>
            <p>{{item.foodExplain}}</p>
            <p>&#165;{{item.foodPrice}}</p>
          </div>
        </div>
        <div class="food-right">
          <!--放在div里面而不是直接放一个i标签，为了对齐，div里面的i和p里面span可以没有，但这两个容器要有，把位置站住，+才能对齐-->
          <div>
            <i class="fa fa-minus-circle" @click="minus(index)" v-show="item.quantity!=0"></i>
          </div>
          <p><span v-show="item.quantity!=0">{{item.quantity}}</span></p>
          <div>
            <i class="fa fa-plus-circle" @click="add(index)"></i>
          </div>
        </div>
      </li>
    </ul>

    <!--购物车部分-->
    <div class="cart">
      <div class="cart-left">
        <div class="cart-left-icon" :style="totalQuantity==0?'background-color:#505051;':'background-color:#3190E8;'">
          <i class="fa fa-shopping-cart"></i>
          <div class="cart-left-icon-quantity" v-show="totalQuantity!=0">{{totalQuantity}}</div>
        </div>
        <div class="cart-left-info">
          <p>&#165;{{totalPrice}}</p>
          <p>另需配送费{{business.deliveryPrice}}元</p>
        </div>
      </div>
      <div class="cart-right">
        <!--不够起送费时-->
        <div class="cart-right-item" v-show="totalSettle<business.startPrice" style="background-color: #535356;cursor: default">&#165;{{business.startPrice}}起送</div>
        <!--达到起送费时-->
        <div class="cart-right-item" @click="toOrder" v-show="totalSettle>=business.startPrice">去结算</div>
      </div>
    </div>

  </div>
</template>

<style scoped>
/*总容器*/
.wrapper{
  width: 100%;
  height: 100%;
}

/*header*/
.wrapper header{
  width: 100%;
  height: 12vw;
  background-color: #0097FF;
  color: #fff;
  font-size: 4.8vw;
  position: fixed;
  left: 0;
  top: 0;
  z-index: 1000;
  display: flex;
  justify-content: center;
  align-items: center;
}

/*商家logo部分*/
.wrapper .business-logo{
  width: 100%;
  height: 35vw;
  margin-top: 12vw;
  display: flex;
  justify-content: center;
  align-items: center;
}
.wrapper .business-logo img{
  width: 40vw;
  height: 30vw;
  border-radius: 5px;
}
.wrapper .business-info{
  width: 100%;
  height: 20vw;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.wrapper .business-info h1{
  font-size: 5vw;
}
.wrapper .business-info p{
  font-size: 3vw;
  color: #666;
  margin-top: 1vw;
}

/*食品列表部分*/
.wrapper .food{
  width: 100%;
  padding-bottom: 14vw;
  margin-bottom: 14vw;
}
.wrapper .food li{
  width: 100%;
  box-sizing: border-box;
  padding: 2.5vw;
  user-select: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.wrapper .food li .food-left{
  display: flex;
  align-items: center;
}
.wrapper .food li .food-left img{
  width: 20vw;
  height: 20vw;
}
.wrapper .food li .food-left .food-left-info{
  margin-left: 3vw;
}
.wrapper .food li .food-left .food-left-info h3{
  font-size: 3.8vw;
  color: #555;
}
.wrapper .food li .food-left .food-left-info p{
  font-size: 3vw;
  color: #888;
  margin-top: 2vw;
}
.wrapper .food li .food-right{
  width: 16vw;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.wrapper .food li .food-right .fa-minus-circle{
  font-size: 5.5vw;
  color: #999;
  cursor: pointer;
}
.wrapper .food li .food-right p{
  font-size: 3.6vw;
  color: #333;
}
.wrapper .food li .food-right .fa-plus-circle{
  font-size: 5.5vw;
  color: #0097EF;
  cursor: pointer;
}

/*购物车部分*/
.wrapper .cart{
  width: 100%;
  height: 14vw;
  position: fixed;
  left: 0;
  bottom: 0;
  display: flex;
}
.wrapper .cart .cart-left{
  flex: 2;
  background-color: #505051;
  display: flex;
}
.wrapper .cart .cart-left .cart-left-icon{
  width: 16vw;
  height: 16vw;
  box-sizing: border-box;
  border: solid 1.6vw #444;
  border-radius: 8vw;
  background-color: #3190E8;
  font-size: 7vw;
  color: #fff;
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: -4vw;/* 会顶出来 */
  margin-left: 3vw;
  position: relative;
}
.wrapper .cart .cart-left .cart-left-icon-quantity{
  width: 5vw;
  height: 5vw;
  border-radius: 2.5vw;
  background-color: red;
  color: #fff;
  font-size: 3.6vw;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  right: -1.5vw;
  top: -1.5vw;
}
.wrapper .cart .cart-left .cart-left-info p{
  font-size: 4.5vw;
  color: #fff;
  margin-top: 1vw;
}
.wrapper .cart .cart-left .cart-left-info p:last-child{
  font-size: 2.8vw;
  color: #AAA;
  margin-top: 0;
}
.wrapper .cart .cart-right{
  flex: 1;
}
/*达到起送费时的样式*/
.wrapper .cart .cart-right .cart-right-item{
  width: 100%;
  height: 100%;
  background-color: #38CA73;
  color: #fff;
  font-size: 4.5vw;
  font-weight: 700;
  user-select: none;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
}
/*不够起送费时的样式*/
/* .wrapper .cart .cart-right .cart-right-item{
	width: 100%;
	height: 100%;
	background-color: #535356;
	color: #fff;
	font-size: 4.5vw;
	font-weight: 700;
	user-select: none;
	display: flex;
	justify-content: center;
	align-items: center;
} */
</style>